//essa classe tem funcao de guardar todas as informacoes do objetivos.
package br.cnpq.webflowah.beans;

import java.io.Serializable;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;

public class Objetivo implements Serializable {

	private static final long serialVersionUID = 1L;

	private Conceito tarefa;

	private Conceito objeto;

	private List<Conceito> entradas;

	private List<Conceito> saidas;

	private List<Conceito> preCondicoes;

	private List<Conceito> efeitos;

	/**
	 * Add by Fred
	 *
	 * Usado para armazenar a preferência do usuário com relação ao impacto dos
	 * metadados relacionados a este Objetivo.
	 */
	private String impactoDesejado;

	public Objetivo() {

	}

	public Conceito getTarefa() {
		return this.tarefa;
	}

	public void setTarefa(Conceito tarefa) {
		this.tarefa = tarefa;
	}

	public Conceito getObjeto() {
		return this.objeto;
	}

	public void setObjeto(Conceito objeto) {
		this.objeto = objeto;
	}

	public URI getURI() {
		if (this.tarefa != null && this.objeto != null) {
			return URI.create("#" + this.tarefa.getNome() + "_"
					+ this.objeto.getNome());
		}

		return null;
	}

	public Conceito addEntrada(Conceito item) {
		if (item == null)
			throw new IllegalArgumentException("entrada nula");
		if (entradas == null)
			entradas = new ArrayList<Conceito>();
		entradas.add(item);
		return item;
	}

//	public Conceito getEntrada(String nome) {
//		Conceito entrada = null;
//		if (nome == null)
//			throw new IllegalArgumentException("nome nulo");
//		if (entradas != null) {
//			Iterator iter = entradas.listIterator();
//			while (iter.hasNext()) {
//				entrada = (Conceito) iter.next();
//				if (entrada.equals(nome))
//					break;
//			}
//		}
//		return entrada;
//	}

	public boolean hasEntrada(Conceito item) {
		for (int i=0; entradas != null && i < entradas.size(); i++) {
			Conceito entrada = entradas.get(i);
			if (entrada.getNome().equals(item.getNome()))
				return true;
		}
		return false;
	}

	public List getEntradas() {
		return this.entradas;
	}

	public Conceito removeEntrada(Conceito item) {
		Conceito entrada = null;
		if (item == null)
			throw new IllegalArgumentException("entrada nula");
		if (entradas != null) {
			if (entradas.remove(item)) {
				entrada = item;
			}
		}
		return entrada;
	}

	public boolean hasPreCondicao(Conceito item) {
		for (int i=0; preCondicoes != null && i < preCondicoes.size(); i++) {
			Conceito preCondicao = preCondicoes.get(i);
			if (preCondicao.getNome().equals(item.getNome()))
				return true;
		}
		return false;
	}

	public Conceito addPreCondicao(Conceito item) {
		if (item == null)
			throw new IllegalArgumentException("precondicao nula");
		if (preCondicoes == null)
			preCondicoes = new ArrayList<Conceito>();
		preCondicoes.add(item);
		return item;
	}

//	public boolean hasPreCondicao(Condicao item) {
//		for (int i=0; preCondicoes != null && i < preCondicoes.size(); i++) {
//			Condicao condicao = preCondicoes.get(i);
//			if (condicao.getNome().equals(item.getNome()))
//				return true;
//		}
//		return false;
//	}

//	public Conceito getPreCondicao(String nome) {
//		Conceito preCondicao = null;
//		if (nome == null)
//			throw new IllegalArgumentException("nome nulo");
//		if (preCondicoes != null) {
//			Iterator iter = preCondicoes.listIterator();
//			while (iter.hasNext()) {
//				preCondicao = (Conceito) iter.next();
//				if (preCondicao.equals(nome))
//					break;
//			}
//		}
//		return preCondicao;
//	}

	public Conceito removePreCondicao(Conceito item) {
		Conceito preCondicao = null;
		if (item == null)
			throw new IllegalArgumentException("precondicao nula");
		if (preCondicoes != null) {
			if (preCondicoes.remove(item))
				preCondicao = item;
		}
		return preCondicao;
	}

	public List getPreCondicoes() {
		return this.preCondicoes;
	}

	public Conceito addSaida(Conceito item) {
		if (item == null)
			throw new IllegalArgumentException("saida nula");
		if (saidas == null) {
			saidas = new ArrayList<Conceito>();
		}
		saidas.add(item);
		return item;
	}

//	public Conceito getSaida(String nome) {
//		Conceito saida = null;
//		if (nome == null)
//			throw new IllegalArgumentException("nome nulo");
//		if (saidas != null) {
//			Iterator iter = saidas.listIterator();
//			while (iter.hasNext()) {
//				saida = (Conceito) iter.next();
//				if (saida.equals(nome))
//					break;
//			}
//		}
//		return saida;
//	}

	public boolean hasSaida(Conceito item) {
		for (int i=0; saidas != null && i < saidas.size(); i++) {
			Conceito saida = saidas.get(i);
			if (saida.getNome().equals(item.getNome()))
				return true;
		}
		return false;
	}

	public List getSaidas() {
		return this.saidas;
	}

	public Conceito removeSaida(Conceito item) {
		Conceito saida = null;
		if (item == null)
			throw new IllegalArgumentException("saida nula");
		if (saidas != null) {
			if (saidas.remove(item)) {
				saida = item;
			}
		}
		return saida;
	}

	public Conceito addEfeito(Conceito item) {
		if (item == null)
			throw new IllegalArgumentException("efeito nulo");
		if (efeitos == null)
			efeitos = new ArrayList<Conceito>();
		efeitos.add(item);
		return item;
	}

//	public Conceito getPosCondicao(String nome) {
//		Conceito posCondicao = null;
//		if (nome == null)
//			throw new IllegalArgumentException("nome nulo");
//		if (efeitos != null) {
//			Iterator iter = efeitos.listIterator();
//			while (iter.hasNext()) {
//				posCondicao = (Conceito) iter.next();
//				if (posCondicao.equals(nome))
//					break;
//			}
//		}
//		return posCondicao;
//	}

	public Conceito removeEfeito(Conceito item) {
		Conceito efeito = null;
		if (item == null)
			throw new IllegalArgumentException("efeito nulo");
		if (efeitos != null) {
			if (efeitos.remove(item))
				efeito = item;
		}
		return efeito;
	}

	public List getEfeitos() {
		return this.efeitos;
	}

	public boolean hasEfeito(Conceito item) {
		for (int i=0; efeitos != null && i < efeitos.size(); i++) {
			Conceito efeito = efeitos.get(i);
			if (efeito.getNome().equals(item.getNome()))
				return true;
		}
		return false;
	}

	public String toString() {
		return "Objective "+ getNome();
	}

	public String getNome() {
		return (this.tarefa != null && this.objeto != null)
			? this.tarefa.getNome() + "_" + this.objeto.getNome()
			: null;
	}

	@Override
	public boolean equals(Object obj) {
		Objetivo o = (Objetivo) obj;
		Conceito tarefa = o.getTarefa();
		Conceito objeto = o.getObjeto();
		return (this.tarefa.getURI().equals(tarefa.getURI()) &&
				this.objeto.getURI().equals(objeto.getURI()));
	}

	public String getImpactoDesejado() {
		return impactoDesejado;
	}

	public void setImpactoDesejado(String impactoDesejado) {
		this.impactoDesejado = impactoDesejado;
	}

}
